package com.demo.java.OD301_350.OD342;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author bug菌
 * @Source 公众号：猿圈奇妙屋
 * @des： 【计算最接近的数(B卷)】问题
 * @url： https://blog.csdn.net/weixin_43970743/article/details/146158274
 */
public class OdMain {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        // 读取输入的字符串，并去除中括号和空格
        String input = scanner.nextLine().replaceAll("[\\[\\]\\s]", "");

        // 将输入的字符串按逗号分割成数组
        String[] numberStrings = input.split(",");

        // 计算数组的长度（N）并提取K的值
        int N = numberStrings.length - 1;  // N 是数组的长度减去1，因为最后一个数是K
        int[] nums = new int[N];  // 创建一个长度为N的数组，用于存储数字
        int K = Integer.parseInt(numberStrings[N]);  // 将数组中的最后一个元素作为K，表示子数组的长度

        // 将字符串数组转化为整型数组nums
        for (int i = 0; i < N; i++) {
            nums[i] = Integer.parseInt(numberStrings[i]);  // 将每个数字字符串转换为整数
        }

        // 计算数组nums的中位数
        int mid = findMedian(nums);

        // 初始化最小差值为最大整数，初始时索引为-1
        int min = Integer.MAX_VALUE;
        int index = -1;

        // 遍历数组，计算每个长度为K的子数组与中位数的差值
        for (int i = 0; i <= N - K; i++) {  // 仅遍历到N - K的部分，因为子数组需要有K个元素
            int count = nums[i];  // 子数组的第一个元素

            // 遍历子数组的其余元素并计算子数组的和
            for (int j = i + 1; j < i + K; j++) {
                count -= nums[j];  // 对子数组的元素进行求和（需要注意这里的逻辑是减法，可能是编程时的笔误，应该是加法）
            }

            // 计算当前子数组和中位数的差值
            int distance = Math.abs(count - mid);

            // 如果当前差值小于最小差值，更新最小差值和子数组的起始位置
            if (distance < min) {
                min = distance;
                index = i;
            }
        }

        // 输出最小差值对应的子数组的起始位置
        System.out.println(index);  // 输出时数组索引从0开始，所以输出的是子数组的起始位置
    }

    /**
     * 计算数组的中位数
     *
     * @param nums 输入数组
     * @return 数组的中位数
     */
    private static int findMedian(int[] nums) {
        // 创建一个新的数组sortedNums，并将nums复制到其中
        int[] sortedNums = Arrays.copyOf(nums, nums.length);

        // 对复制的数组进行排序
        Arrays.sort(sortedNums);

        // 获取排序后数组的长度
        int N = sortedNums.length;

        // 返回排序后数组的中位数
        return sortedNums[N / 2];  // 假设数组长度为奇数，直接返回中间的元素；如果是偶数，返回较小的中位数
    }
}